package zuoye5.第一题;

import java.io.*;
import java.util.*;

/**
 *使用 List 集合实现简易的学生信息管理系统，要求打印字符界面提示用户选择相应的功 能，根据用户输入的选择去实现增加、删除、修改、查找以及遍历所有学生信息的功能。
 *
 *  其中学生的信息有：学号、姓名、年龄。 要求： 尽量将功能拆分为多个.java 文件。
 *  1. 编程题
 *
 *   基于学生信息管理系统增加以下两个功能：
 *
 *             a.自定义学号异常类和年龄异常类，并在该成员变量不合理时产生异常对象并抛出。
 *
 *             b.当系统退出时将 List 集合中所有学生信息写入到文件中，当系统启动时读取文件中所 有学生信息到 List 集合中。
 */
public class ListFunction {

    public static HashMap<Integer, StudentInformation> map = new HashMap<>();

    public static List<Object> list = new ArrayList<>();

    public static void main(String[] args) throws StudentIdException, StudentAgeException, IOException, ClassNotFoundException {
        //创建一个空的文件，防止再次进入程序时读文件出问题
        File file = new File("F:"+File.separator+"444"+File.separator+"111.txt");
        ObjectInputStream oos = null;
        if (file.exists()){
            if (file.length()==0) {
                System.out.println("当前文件为空文件，请直接进入流程");
            }else {
                oos = new ObjectInputStream(new FileInputStream("F:"+File.separator+"444"+File.separator+"111.txt"));
                List<Object> l1 = (List<Object>)oos.readObject();
                list=l1;
                Object o = l1.get(0);
                HashMap hm = (HashMap)o;
                map = hm;
            }
        }else {
            file.createNewFile();
            if (file.length()==0) {
                System.out.println("当前文件为空文件，请直接进入流程");
            }else {
                oos = new ObjectInputStream(new FileInputStream("F:"+File.separator+"444"+File.separator+"111.txt"));
                List<Object> l1 = (List<Object>)oos.readObject();
                Object o = l1.get(0);
                HashMap hm = (HashMap)o;
                map = hm;
            }
        }
        ListFunction.list.add(ListFunction.map);
        ListFunction listFunction = new ListFunction();
        Scanner sc = new Scanner(System.in);
        while(true){
            System.out.println("欢迎来到学生信息管理系统！");
            System.out.println("本系统有增加、删除、修改、查找以及遍历所有学生信息的功能");
            System.out.println("1.增加 2.删除 3.修改 4.查找 5.遍历 6退出");
            System.out.println("请输入对应的数字");
            int number = sc.nextInt();
            if (6==number){
                System.out.println("谢谢使用，再见");
                ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream(file));
                oos1.writeObject(list);
                break;
            }
            switch (number){
                case 1:listFunction.addStudent();break;
                case 2:listFunction.deleteStudent();break;
                case 3:listFunction.modifyStudent();break;
                case 4:listFunction.lookUpStudent();break;
                case 5:ListFunction.ergodicStudent();break;
            }
        }
    }

    private static void ergodicStudent() {
        Set<Integer> integers = ListFunction.map.keySet();
        for (Integer integer:integers){
            System.out.print("同学Id = " + map.get(integer).getStudentId() + "  同学姓名 = " + map.get(integer).getStudentName() + "  同学年龄 = " + map.get(integer).getStudentAge());
            System.out.println();
        }

    }

    private void lookUpStudent() {
        if (!ListFunction.map.isEmpty()) {
            System.out.println("请输入您要查看的学生学号");
            Scanner sc = new Scanner(System.in);
            int lookUpStudentId = sc.nextInt();
            while (true) {
                if (!map.containsKey((Integer) lookUpStudentId)) {
                    System.out.println("我们并未查找到此同学，请重新输入学号");
                    lookUpStudentId = sc.nextInt();
                }else{
                    System.out.println("已查找到此同学");
                    System.out.println(map.get(lookUpStudentId));
                    break;
                }
            }
        }else {
            System.out.println("请先添加同学");
        }

        }




    private void modifyStudent() throws StudentIdException, StudentAgeException {
        if (!ListFunction.map.isEmpty()) {
            StudentInformation sf = new StudentInformation();
            System.out.println("请输入您要修改的学生学号，6位有效数字");
            Scanner sc = new Scanner(System.in);
            int modifyStudentId = sc.nextInt();
            while(true) {
                if (!ListFunction.map.containsKey((Integer) modifyStudentId)) {
                    System.out.println("我们并未查找到此同学，请重新输入学号");
                    modifyStudentId = sc.nextInt();
                } else {
                    System.out.println("已查找到此同学");
                    System.out.println(map.get(modifyStudentId));
                    ListFunction.map.remove((Integer) modifyStudentId);
                    break;
                }
            }
            System.out.println("请输入新的学生学号，为6位有效数字");
            Scanner sc1 = new Scanner(System.in);
            int mofidyStudentId1 = sc1.nextInt();
            String modifyStudentId2 = mofidyStudentId1+"";
            String studentIdReg = "^[0-9]{1,6}$";
            while(true) {
                if (!modifyStudentId2.matches(studentIdReg)) {
                    System.out.println("你输入的不对哟，不要调皮哟，再输一次吧");
                    mofidyStudentId1 = sc1.nextInt();
                    modifyStudentId2 = mofidyStudentId1 + "";
                } else if (ListFunction.map.containsKey((Integer) mofidyStudentId1)){
                    System.out.println("该同学已存在，请重输");
                    mofidyStudentId1 = sc1.nextInt();
                    modifyStudentId2 = mofidyStudentId1 + "";
                }else{
                    sf.setStudentId(mofidyStudentId1);
                    System.out.println("成功");
                    break;
                }
            }
            System.out.println("接下来请写上你恢弘帅气的大名吧，奥里给！！！");
            Scanner sc2 = new Scanner(System.in);
            String modifyStudentName2 = sc2.nextLine();
            String studentNameReg = "^[一-龥]{2,6}$";
            while(true) {
                if (!modifyStudentName2.matches(studentNameReg)){
                    System.out.println("麻烦大侠就输2到6个汉字可好，如是我才疏学浅，有些许莽撞，也是mo的办法，再来一次");
                    modifyStudentName2 = sc2.nextLine();
                } else {
                    sf.setStudentName(modifyStudentName2);
                    System.out.println("成功");
                    break;
                }
            }
            System.out.println("请输入年龄");
            Scanner sc3 = new Scanner(System.in);
            int input3 = sc3.nextInt();
            String input4 = input3+"";
            String studentAgeReg = "^[1-9][0-9]{0,2}$";
            while(true) {
                if (!input4.matches(studentAgeReg)) {
                    System.out.println("大侠我们就输三位数字可好，长命千岁这是小说里的情节，不能走火入魔啊");
                    input3 = sc3.nextInt();
                    input4 = input3 + "";
                }else {
                    sf.setStudentAge(input3);
                    System.out.println("成功");
                    break;
                }
            }
            System.out.println("恭喜你修改成功");
            ListFunction.map.put(sf.getStudentId(),sf);
        }else {
            System.out.println("请先添加同学");
        }

        ListFunction.ergodicStudent();

    }

    private void deleteStudent() {
        if (!ListFunction.map.isEmpty()) {
            System.out.println("请输入要删除学生的学号");
            Scanner sc = new Scanner(System.in);
            int studentIdNum = sc.nextInt();
            while (true) {
                if (!map.containsKey((Integer) studentIdNum)) {
                    System.out.println("我们并未查找到此同学，请重新输入学号");
                    studentIdNum = sc.nextInt();
                }else {
                    map.remove(studentIdNum);
                    System.out.println("此同学已删除");
                    break;
                }
            }
        }else {
            System.out.println("请先添加同学");
        }

        ListFunction.ergodicStudent();
    }

    private void addStudent() throws StudentIdException, StudentAgeException {
        StudentInformation student = new StudentInformation();
        Scanner sc1 = new Scanner(System.in);
        System.out.println("请输入要添加的学生学号，为6位有效数字");
        int input = sc1.nextInt();
        String input1 = input+"";
        String studentIdReg = "^[0-9]{1,6}$";
        while(true) {
            if (!input1.matches(studentIdReg)) {
                System.out.println("你输入的不对哟，不要调皮哟，再输一次吧");
                input = sc1.nextInt();
                input1 = input + "";
            } else if (ListFunction.map.containsKey((Integer) input)){
                System.out.println("该同学已存在，请重输");
                input = sc1.nextInt();
                input1 = input + "";
            }else{
                student.setStudentId(input);
                System.out.println("成功");
                break;
            }
        }
        System.out.println("接下来请写上你恢弘帅气的大名吧，奥里给！！！");
        Scanner sc2 = new Scanner(System.in);
        String input2 = sc2.nextLine();
        String studentNameReg = "^[一-龥]{2,6}$";
        while(true) {
            if (!input2.matches(studentNameReg)){
                System.out.println("麻烦大侠就输2到6个汉字可好，如是我才疏学浅，有些许莽撞，也是mo的办法，再来一次");
                input2 = sc2.nextLine();
            } else {
                student.setStudentName(input2);
                System.out.println("成功");
                break;
            }
        }
        System.out.println("请输入年龄");
        Scanner sc3 = new Scanner(System.in);
        int input3 = sc3.nextInt();
        String input4 = input3+"";
        String studentAgeReg = "^[1-9][0-9]{0,2}$";
        while(true) {
            if (!input4.matches(studentAgeReg)) {
                System.out.println("大侠我们就输三位数字可好，长命千岁这是小说里的情节，不能走火入魔啊");
                input3 = sc3.nextInt();
                input4 = input3 + "";
            }else {
                student.setStudentAge(input3);
                System.out.println("成功");
                break;
            }
        }
        System.out.println("恭喜你输好啦，是不是有点小爽");
        ListFunction.map.put(student.getStudentId(),student);
        ListFunction.ergodicStudent();
    }
}
